iT邦幫忙

2026 iThome 鐵人賽

DAY 5
0
Software Development

從標準到臨床:FHIR 架構與智慧護理資訊系統(NIS)實作 30 天系列 第 5

Day 5:架設在地 FHIR 測試環境:使用 HAPI FHIR Docker 與 PostgreSQL

  • 分享至 

  • xImage
  •  

前言
在前幾天的系列文中,我們從標準演進一路探討到 Patient、Practitioner 與 Observation 的 JSON 規格定義。但光看規格書就像紙上談兵,工程師最渴望的始終是「把服務跑起來,發出第一支真實的 API 請求」。

在醫療資訊領域,如果要自行從零刻出一個完全相容 HL7 FHIR R4 規範(包含搜尋參數、分頁機制、Validation 與 CapabilityStatement)的後端伺服器,工作量極為龐大。因此,業界在進行原型驗證、整合測試或甚至中小型系統建構時,最廣泛採用的開源參考實作就是 HAPI FHIR。

今天我們將使用 Docker Compose,在本地端快速架設一套包含 HAPI FHIR JPA Server(R4) 與 PostgreSQL 的正式測試環境,並驗證 Web 介面與基本健康狀態。

一、公開測試 Server vs 本地 Docker 環境
在評估測試環境時,初學者常面臨兩種選擇:
https://ithelp.ithome.com.tw/upload/images/20260919/20178840cikrqYb4Uk.jpg
因此,為了保證後續 25 天實作流程的穩定性,我們採用本地 Docker 方案。

二、編寫 Docker Compose 設定檔
我們採用多容器編排架構:
1.fhir-db:PostgreSQL 資料庫,作為 HAPI FHIR 的持久化資料底層。
2.fhir-server:官方維護的 hapiproject/hapi:latest(內建支援 FHIR R4),並透過環境變數直接連接 PostgreSQL。

請在專案根目錄下建立 docker-compose.yml:
https://ithelp.ithome.com.tw/upload/images/20260919/20178840YAfG2ejd0Q.jpg

三、一鍵啟動與服務驗證

  1. 啟動容器叢集
    在命令列進入 docker-compose.yml 所在的資料夾,執行以下指令:
    https://ithelp.ithome.com.tw/upload/images/20260919/20178840PEPLfIOH2G.jpg
  2. 檢視啟動日誌
    HAPI FHIR 在初次啟動時,需要連接 PostgreSQL 並初始化數十張醫療資源關聯表(Hibernate 初始化),整個過程約需 30–60 秒。你可以透過以下指令觀察進度:
    https://ithelp.ithome.com.tw/upload/images/20260919/20178840WlW56liiG1.jpg
    當在日誌末尾看到類似下方訊息時,代表伺服器已經成功就緒:
    https://ithelp.ithome.com.tw/upload/images/20260919/20178840DMMfYtvRBS.jpg

四、驗證 FHIR Server 運行狀態

  1. 探索 HAPI FHIR 內建 Web Console
    打開瀏覽器,存取:
    http://localhost:8080

你將進入 HAPI FHIR 的官方圖形化管理面板(Web Tester UI)。在左側欄位中,你可以直接看到所有被支援的 FHIR Resources(包含 Patient、Observation、MedicationRequest 等),並能直接在畫面上進行查詢與手動新增測試。

  1. 透過 HTTP 請求取得系統規格說明書(CapabilityStatement)
    FHIR 標準定義了每個相容的 Server 都必須在根目錄下的 /metadata 端點提供 CapabilityStatement(也稱 Conformance),讓客戶端程式能自動偵測這座伺服器支援哪些 Resources 與搜尋過濾器。

使用 cURL 測試:
https://ithelp.ithome.com.tw/upload/images/20260919/20178840CcV2253d8g.jpg
如果終端機回傳了一個 resourceType 為 "CapabilityStatement" 的龐大 JSON 物件,狀態碼為 200 OK,代表在地化 FHIR 測試環境已經完全就緒!

五、實務踩坑提醒與資源配置
1.記憶體配置不足導致 OOM(Out Of Memory):
HAPI FHIR 內部採用 Spring Boot + Lucene/Hibernate Search,若 Docker 預設記憶體僅給 1GB,伺服器可能在初次建立資料庫綱要(Schema)時崩潰。建議在 Docker Desktop 中將記憶體限制放寬至 3GB 或以上,並保留 JAVA_TOOL_OPTIONS=-Xmx2048m。
2.連線重試等待(Depends On):
若未加入 service_healthy 條件,HAPI FHIR 有可能在 PostgreSQL 尚未準備就緒前搶先嘗試建立連線而報錯重啟。上述 Compose 設定檔已妥善配置健康檢查(Healthcheck),能確保相依性啟動順暢。

小結
今天我們成功在本機搭建了一套專屬的醫療標準沙盒環境:
1.透過 Docker Compose 整合了 PostgreSQL 與 HAPI FHIR R4 JPA Server。
2.掌握了初次建置時的日誌追蹤與記憶體資源配置技巧。
3.驗證了 Web 管理介面與 /metadata(CapabilityStatement)標準檢查點。

現在,我們手中已經擁有了一座隨時可供讀寫的標準 FHIR 伺服器。明天 Day 6,我們將正式拿起 Postman 與 cURL,實測 FHIR RESTful CRUD 操作與進階 Search Parameters,把前幾天撰寫的 Patient 與 Observation 真正送進資料庫中!


上一篇
Day 4:生命徵象與檢驗數據模型:Observation Resource 深度解析與編碼系統(LOINC)
下一篇
Day 6:使用 Postman 與 cURL 驗證 FHIR CRUD 操作與 Search Parameters
系列文
從標準到臨床:FHIR 架構與智慧護理資訊系統(NIS)實作 30 天7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言